#include "singleton.h"
#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QString>
#include <QDebug>
std::shared_ptr<Singleton> Singleton::mInstance = nullptr;
std::once_flag Singleton::mflag;

Singleton::Singleton(): mFileName("./config.json"){

}

Singleton::~Singleton(){

}
//当使用std::call_once时，需要使用std::shared_ptr的自定义删除器来释放单例实例。
//这可以通过传递一个lambda函数作为std::shared_ptr的第二个参数来实现。
/*
 * std::shared_ptr将使用自定义的删除器来释放单例实例。现在，应该能够成功编译并运行你的代码。对于高并发情况下的唯一性，
 * std::call_once将确保只有一个线程能够创建单例实例，并安全地共享该实例。
*/
std::shared_ptr<Singleton> Singleton::GetInstance() {
    std::call_once(mflag, []() {
        mInstance = std::shared_ptr<Singleton>(new Singleton(),
                                               [](Singleton* ptr){delete ptr;});
    });

    return mInstance;
}


bool Singleton::readConfigFile(QString& username, QString& password){
    QFile file(mFileName);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "Open File error" << mFileName;
        return false;
    }

    QJsonDocument jsonDoc = QJsonDocument::fromJson(file.readAll());
    file.close();

    if (jsonDoc.isNull() || !jsonDoc.isObject()) {
        qDebug() << "Parse Json Doc Failed";
        return false;
    }

    QJsonObject jsonObj = jsonDoc.object();
    username = jsonObj["username"].toString();
    password = jsonObj["password"].toString();

    return true;
}
bool Singleton::writeConfigFile(const QString& username, const QString& password){
    QFile file(mFileName);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        qDebug() << "Open mFile failed" <<  mFileName;
        return false;
    }

    QJsonObject jsonObj;
    jsonObj["username"] = username;
    jsonObj["password"] = password;

    QJsonDocument jsonDoc(jsonObj);

    file.write(jsonDoc.toJson());
    file.close();

    return true;
}
bool Singleton::deleteConfigFile(){
    QFile file( mFileName);
    if (!file.remove()) {
        qDebug() << "Remove File Failed " <<  mFileName;
        return false;
    }
    return true;
}
bool Singleton::fileIsExists() const{
    QFile file(mFileName);
    return file.exists();
}
void Singleton::clearFile(){
    QFile file(mFileName);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
        qDebug() << "ClearFile error：" <<mFileName;
            return ;
    }
    file.close();
    return;
}
